package com.pyp.kuaishou.controller;

import com.pyp.kuaishou.service.KSAuthService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;
import java.util.Map;

/**
 * 作者: lauJinyu
 * 控制层：负责H5授权入口与回调，严格避免直接DB/HTML操作
 */
@Controller
@RequiredArgsConstructor
@Slf4j
public class AuthController {

    private final KSAuthService ksAuthService; // 业务层处理所有快手相关逻辑

    /**
     * H5页面：生成授权链接，前端JS跳转
     */
    @GetMapping("/auth")
    public String authPage(Model model, @RequestParam("app_id") String appId) {
        // 生成授权URL供前端点击跳转
        String authorizeUrl = ksAuthService.buildAuthorizeUrl(appId);
        model.addAttribute("authorizeUrl", authorizeUrl);
        model.addAttribute("appId", appId);
        return "auth/index"; // 视图层渲染
    }

    /**
     * 授权回调：快手将以 ?code=xxx&state={app_id} 的形式回调
     * 说明：state 携带我们在授权时设置的 app_id
     * 作者: lauJinyu
     */
    @GetMapping("/auth/callback")
    public String callback(
            @RequestParam(value = "code", required = false) String code,
            @RequestParam(value = "state", required = false) String state,
            @RequestParam(value = "error", required = false) String error,
            @RequestParam(value = "error_msg", required = false) String errorMsg,
            Model model) {
        // 使用 state 作为 appId（符合快手回调约定）
        String appId = state; // 如果 state 为空，将在 Service 中做校验
        
        // 如果有错误，直接返回错误信息
        if (error != null) {
            Map<String, Object> errorResult = new HashMap<>();
            errorResult.put("success", false);
            errorResult.put("message", "授权失败: " + error + (errorMsg != null ? " - " + errorMsg : ""));
            model.addAttribute("result", errorResult);
            model.addAttribute("appId", appId);
            return "auth/callback";
        }
        
        Map<String, Object> res = ksAuthService.handleCallback(code, state);
        model.addAttribute("result", res);
        model.addAttribute("appId", appId);
        return "auth/callback";
    }

    /**
     * 快手回调入口：支持 /kuaishou/callback 路径
     * 作者: lauJinyu
     */
    @GetMapping("/kuaishou/callback")
    @ResponseBody
    public Map<String, Object> kuaishouCallback(
            @RequestParam(value = "code", required = false) String code,
            @RequestParam(value = "state", required = false) String state,
            @RequestParam(value = "error", required = false) String error,
            @RequestParam(value = "error_msg", required = false) String errorMsg,
            Model model) {
        // 委托给原有的回调处理逻辑
        Map<String, Object> res = new HashMap<>();
        if (error != null) {
            res.put("success", false);
            res.put("message", "授权失败: " + error + (errorMsg != null ? " - " + errorMsg : ""));
            return res;
        }
        return ksAuthService.handleCallback(code, state);
    }

    /**
     * 快手授权回调并自动发布接口（无感知一键发布）
     * 作者: lauJinyu
     * @param code 快手授权码
     * @param state 状态参数（包含app_id）
     * @return JSON格式的发布结果
     */
    @GetMapping("/kuaishou/auto-publish")
    @ResponseBody
    public Map<String, Object> autoPublish(
            @RequestParam(value = "code", required = false) String code, 
            @RequestParam(value = "state", required = false) String state) {
        log.info("收到快手自动发布请求，code: {}, state: {}", code, state);
        
        try {
            // 调用服务层处理授权回调并自动发布
            Map<String, Object> result = ksAuthService.handleCallbackAndPublish(code, state);
            
            log.info("快手自动发布处理完成，结果: {}", result.get("success"));
            return result;
            
        } catch (Exception e) {
            log.error("快手自动发布接口异常", e);
            Map<String, Object> errorResult = new HashMap<>();
            errorResult.put("success", false);
            errorResult.put("msg", "接口处理异常: " + e.getMessage());
            errorResult.put("exception", e.getMessage());
            return errorResult;
        }
    }

    /**
     * 作者: lauJinyu
     * 单一入口：一键发布跳转接口
     * 说明：前端仅需调用该接口，并携带 app_id 参数。
     *      本接口将直接 302 重定向至快手授权页，用户授权后由 /kuaishou/auto-publish 完成后续自动发布。
     */
    @GetMapping("/one-click-publish")
    public String oneClickPublish(@RequestParam("app_id") String appId) {
        // 构建授权URL并重定向（保持前端只调用一个接口）
        String authorizeUrl = ksAuthService.buildAuthorizeUrl(appId);
        return "redirect:" + authorizeUrl;
    }
}